package com.zenithmind.version.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.version.pojo.domain.Tag;
import com.zenithmind.version.pojo.dto.TagCreateDTO;
import com.zenithmind.version.pojo.dto.TagUpdateDTO;
import com.zenithmind.version.pojo.query.TagQueryDTO;
import com.zenithmind.version.pojo.vo.TagVO;

import java.util.List;

/**
 * 标签服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface TagService extends IService<Tag> {

    /**
     * 创建标签
     * 
     * @param createDTO 创建信息
     * @return 标签信息
     */
    TagVO createTag(TagCreateDTO createDTO);

    /**
     * 更新标签
     * 
     * @param id 标签ID
     * @param updateDTO 更新信息
     * @return 是否成功
     */
    Boolean updateTag(String id, TagUpdateDTO updateDTO);

    /**
     * 删除标签
     * 
     * @param id 标签ID
     * @return 是否成功
     */
    Boolean deleteTag(String id);

    /**
     * 批量删除标签
     * 
     * @param ids 标签ID列表
     * @return 是否成功
     */
    Boolean batchDeleteTags(List<String> ids);

    /**
     * 分页查询标签
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<TagVO> getTagPage(TagQueryDTO queryDTO);

    /**
     * 获取标签详情
     * 
     * @param id 标签ID
     * @return 标签详情
     */
    TagVO getTagDetail(String id);

    /**
     * 获取仓库标签列表
     * 
     * @param repositoryId 仓库ID
     * @param tagType 标签类型
     * @param limit 限制数量
     * @return 标签列表
     */
    List<TagVO> getRepositoryTags(String repositoryId, Integer tagType, Integer limit);

    /**
     * 根据名称获取标签
     * 
     * @param repositoryId 仓库ID
     * @param tagName 标签名称
     * @return 标签信息
     */
    TagVO getTagByName(String repositoryId, String tagName);

    /**
     * 获取版本标签列表
     * 
     * @param repositoryId 仓库ID
     * @param limit 限制数量
     * @return 版本标签列表
     */
    List<TagVO> getVersionTags(String repositoryId, Integer limit);

    /**
     * 获取发布标签列表
     * 
     * @param repositoryId 仓库ID
     * @param limit 限制数量
     * @return 发布标签列表
     */
    List<TagVO> getReleaseTags(String repositoryId, Integer limit);

    /**
     * 获取最新版本标签
     * 
     * @param repositoryId 仓库ID
     * @return 最新版本标签
     */
    TagVO getLatestVersionTag(String repositoryId);

    /**
     * 获取提交的标签列表
     * 
     * @param commitId 提交ID
     * @return 标签列表
     */
    List<TagVO> getCommitTags(String commitId);

    /**
     * 搜索标签
     * 
     * @param repositoryId 仓库ID
     * @param keyword 关键词
     * @param tagType 标签类型
     * @param limit 限制数量
     * @return 标签列表
     */
    List<TagVO> searchTags(String repositoryId, String keyword, Integer tagType, Integer limit);

    /**
     * 获取用户创建的标签
     * 
     * @param creatorId 创建者ID
     * @param repositoryId 仓库ID
     * @param limit 限制数量
     * @return 标签列表
     */
    List<TagVO> getUserTags(String creatorId, String repositoryId, Integer limit);

    /**
     * 比较标签差异
     * 
     * @param repositoryId 仓库ID
     * @param fromTag 源标签
     * @param toTag 目标标签
     * @return 差异信息
     */
    Object compareTagDifferences(String repositoryId, String fromTag, String toTag);

    /**
     * 获取标签之间的提交列表
     * 
     * @param repositoryId 仓库ID
     * @param fromTag 源标签
     * @param toTag 目标标签
     * @return 提交列表
     */
    List<Object> getCommitsBetweenTags(String repositoryId, String fromTag, String toTag);

    /**
     * 获取标签统计信息
     * 
     * @param repositoryId 仓库ID
     * @return 统计信息
     */
    Object getTagStatistics(String repositoryId);

    /**
     * 复制标签到其他提交
     * 
     * @param sourceTagId 源标签ID
     * @param targetCommitId 目标提交ID
     * @param newTagName 新标签名称
     * @param userId 用户ID
     * @return 新标签信息
     */
    TagVO copyTagToCommit(String sourceTagId, String targetCommitId, String newTagName, String userId);

    /**
     * 检查标签名称是否存在
     * 
     * @param repositoryId 仓库ID
     * @param tagName 标签名称
     * @param excludeId 排除的标签ID
     * @return 是否存在
     */
    Boolean checkTagNameExists(String repositoryId, String tagName, String excludeId);

    /**
     * 创建版本标签
     * 
     * @param repositoryId 仓库ID
     * @param commitId 提交ID
     * @param version 版本号
     * @param description 描述
     * @param userId 用户ID
     * @return 标签信息
     */
    TagVO createVersionTag(String repositoryId, String commitId, String version, String description, String userId);

    /**
     * 创建发布标签
     * 
     * @param repositoryId 仓库ID
     * @param commitId 提交ID
     * @param releaseName 发布名称
     * @param description 描述
     * @param userId 用户ID
     * @return 标签信息
     */
    TagVO createReleaseTag(String repositoryId, String commitId, String releaseName, String description, String userId);

    /**
     * 获取标签发布说明
     * 
     * @param tagId 标签ID
     * @return 发布说明
     */
    Object getTagReleaseNotes(String tagId);

    /**
     * 更新标签发布说明
     * 
     * @param tagId 标签ID
     * @param releaseNotes 发布说明
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean updateTagReleaseNotes(String tagId, String releaseNotes, String userId);
}
